package com.syn.com.syn.th;

import java.util.concurrent.TimeUnit;

/*
    目标:测试原子性问题
    1、调用正常（不加锁）方法；两个线程都可以正常执行
    2、调用加锁方法，只能有一个线程正常执行，其他线程排队等候
 */
public class SyncAtomicity {
    public static void main(String[] args) throws InterruptedException {
        SyncAtomicity syncAtomicity = new SyncAtomicity();
        //synchronized修饰实例方法
//        new Thread(()->syncAtomicity.testSYNC()).start();
//        new Thread(()->syncAtomicity.testSYNC()).start();


        //synchronized修饰静态方法
       // new Thread(() -> SyncAtomicity.testSYNCForStatic()).start();
       // new Thread(() -> SyncAtomicity.testSYNCForStatic()).start();

        //正常方法
        // new Thread(() -> syncAtomicity.test()).start();
        // new Thread(() -> syncAtomicity.test()).start();


    }
    //加锁方法
    public synchronized void testSYNC() {
        System.out.println("进入testSYNC方法>>>>>>>>>>>>>>>>>>>>>");
        try {
            //模拟方法体尚未执行完毕
            TimeUnit.HOURS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    //加锁方法
    public synchronized static void testSYNCForStatic() {
        System.out.println("进入testSYNC方法>>>>>>>>>>>>>>>>>>>>>");
        try {
            //模拟方法体尚未执行完毕
            TimeUnit.HOURS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    //正常方法
    public void test() {
        System.out.println("进入test方法>>>>>>>>>>>>>>>>>>>>>");
        try {
            //模拟方法体尚未执行完毕
            TimeUnit.HOURS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
